package org.example.retry;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.retry.annotation.Backoff;
import org.springframework.retry.annotation.Recover;
import org.springframework.retry.annotation.Retryable;
import org.springframework.stereotype.Component;

@Slf4j
@Component
public class RetryTestBySpring {
    @Autowired
    private Handler handler;

    /**
     * 重试所调用方法,使用前需要在启动类上添加@EnableRetry注解
     * 重试5次,重试间隔300ms,遇到异常BusiException也重试
     *
     * @param code
     * @return
     */
    @Retryable(/*recover = "recover",*/value = BusiException.class,maxAttempts = 5,backoff = @Backoff(delay = 500))
    public Boolean handle(Integer code) {
        Boolean result = handler.handle(code);
        if (!result) {
            // 抛出异常后会进行重试逻辑
            throw new BusiException("执行失败!");
        }
        return result;
    }

    /**
     * 达到最大重试次数,或抛出了一个没有指定进行重试的异常
     * recover 机制
     * @param e 异常
     * @param param : 需要与@Retryable的入参类型一致
     */
    @Recover
    public Boolean recover(Exception e,Integer param) {
        log.error("达到最大重试次数,或抛出了一个没有指定进行重试的异常:param={}",param,e);
        return false;
    }
}
